Python  Socket+Django简单的视频流

服务端关键源码

网页端

1
2
3
4
5
6
7
8
9
$.get("http://127.0.0.1:8000/blog/img/",function(data,status){
/**,{ZT_arr : '1'}**/
{# alert("链接完成···");#}
{#alert("Data: " + data + "\nStatus: " + status);#}
{#alert($(data).find("img#img1")[0].src);#}
$('#p1').html($(data).find("p#p1").Text);
$('#p2').html($(data).find("p#p2").Text);
$("#img1").attr('src',$(data).find("img#img1")[0].src);
}

后台端

1
2
3
4
5
6
7
8
9
10
11
12
def img(request):
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 9999
serversocket.bind((host, port))
serversocket.listen(5)
arr, arr2 = serversocket.accept()
arrs = arr.recv(999999)
arr.close()
imgStr = arrs.decode('utf-8')
imgStr = 'data:image/jpeg;base64,'+imgStr
return render(request,'blog/echo_img.html',{'arr1':arr2[0],'arr2':arr2[1],'imgStr':imgStr})

客户端关键源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import socket
import sys
import demjson
import re
import base64
from io import BytesIO

import time
from PIL import Image,ImageGrab,ImageTk
def lianjie():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 9999

s.connect((host, port))
return s

def hqpm():
im = ImageGrab.grab()

jpeg_image_buffer = BytesIO()
im.save(jpeg_image_buffer, format="JPEG")
imgStr = base64.b64encode(jpeg_image_buffer.getvalue())
print(imgStr)
return imgStr

if __name__ == '__main__':
while True:
s = lianjie()
imgStr = hqpm()
s.send(imgStr)
time.sleep(0.2)
s.close()

效果图

这就是这个视频流的全部关键代码了,我说下简单的原理,就是利用客服端在电脑上死循环截屏然后发送到服务端,服务端
用一个Ajax来死循环刷新网页的部分内容,这部分内容就是后台Django接收的客服端的图片信息,这样就能在网页上简单的显
示一个无限刷新的图片(约等于视频),但是有个缺点还没有改正,这个网页刷新的时间间隔只能是200毫秒,再短一点就会出
现端口冲突,但这200毫秒不能缩短是致命的,在我们人眼里看起来就和PPT快差不多了,这个问题要等到后面植入其他东西来
优化,或者直接换一种方法也行。

感谢您的阅读,本文由 ZhangAo`s Blog 版权所有。如若转载,请注明出处:ZhangAo`s Blog(https://www.imzhangao.com/2018/05/05/Python Socket+Django简单的视频流/
教你玩不一样的微信跳一跳小游戏
HEXO安装hexo-helper-live2d插件遇到的问题